FI-Beleg mit Umsatzsteuer buchen

Ausnahmsweise mal ein Ausflug in die Welt der Finanzbuchhaltung. Für mich ein Rotes Tuch mit Sieben Siegeln aus einem böhmischen Dorf… Ich werde trotzdem versuchen, den Sachverhalt nicht nur syntaktisch sondern auch inhaltlich korrekt wiederzugeben. Aus diesem Grund werde ich mich bewusst so schwammig wie möglich ausdrücken und Fachtermini wie “Erlöskonto”, “Bilanz” oder “Buchungsschlüssel” vermeiden.

Aufgabe

Buchen eines FI-Beleges mit Umsatzsteuer. Es soll ein Bruttobetrag auf ein Konto und der zugehörige Nettobetrag auf ein Gegenkonto gebucht werden. Die Umsatzsteuer soll auf das richtige Umsatzsteuerkonto gebucht werden.

Hilfsmittel

Dass nur der BAPI_ACC_DOCUMENT_POST für diese Zwecke infrage kommt, war mir immerhin schnell klar. Wie man mit diesem Baustein bucht, habe ich ebenfalls schnell heraus gefunden. Eine Herausforderung war die Buchung der Umsatzsteuer. Von der irrigen Annahme, der Baustein könnte die Umsatzsteuer selber rechnen, habe ich mich schnell verabschieden müssen. Die Umsatzsteuer muss dem Baustein übergeben werden.

Um die Umsatzsteuer zu berechnen, helfen diese beiden Bausteine:

  • CALCULATE_TAX_FROM_NET_AMOUNT
  • CALCULATE_TAX_FROM_GROSSAMOUNT

Desweiteren notwendig ist eine Buchungsperiode. Diese lässt sich zwar auch einfach aus dem Datum errechnen, aber der Baustein CON_FIN_CURRENT_PERIOD_GET_2 hilft ebenfalls weiter. Da der Baustein sich auf den MM-Periodenverschieber bezieht, bin ich mir nicht sicher, ob der Baustein wirklich sinnvoll ist, aber in meinem Fall funktioniert er.

Beleg

Dieser Beleg kommt bei so einer Buchung heraus:

Beleg

Coding

REPORT.
PARAMETERs p_bukrs type bukrs DEFAULT '1000'.

START-OF-SELECTION.

  DATA ls_header TYPE bapiache09.
  DATA lt_return TYPE STANDARD TABLE OF bapiret2.
  DATA ls_return TYPE bapiret2.
  DATA lt_acc_gl TYPE STANDARD TABLE OF bapiacgl09.
  DATA ls_acc_gl LIKE LINE OF lt_acc_gl.
  DATA lt_cur_am TYPE STANDARD TABLE OF bapiaccr09.
  DATA ls_cur_am LIKE LINE OF lt_cur_am.
  DATA lt_acc_tx TYPE STANDARD TABLE OF bapiactx09.
  DATA ls_acc_tx LIKE LINE OF lt_acc_tx.
  data lv_period type POPER.
  data lv_year   type BDATJ.
*== aktuelle Periode ermitteln
  CALL FUNCTION 'CON_FIN_CURRENT_PERIOD_GET_2'
    EXPORTING
      id_bukrs                 = p_bukrs
   IMPORTING
     ED_CURRENT_YEAR          = lv_year
     ED_CURRENT_PERIOD        = lv_period
   EXCEPTIONS
     INTERNAL_ERROR           = 1
     OTHERS                   = 2.

*== Header
  ls_header-bus_act           = 'RFBU'.               "Betriebswirtschaftlicher Vorgang
  ls_header-username          = 'ICH'.                "Name des Benutzers
  ls_header-header_txt        = 'Test'.               "Belegkopftext
  ls_header-comp_code         = p_bukrs.              "Buchungskreis
  ls_header-doc_date          = sy-datum.             "Belegdatum im Beleg
  ls_header-pstng_date        = sy-datum.             "Buchungsdatum im Beleg
  ls_header-trans_date        = sy-datum.             "Umrechnungsdatum
  ls_header-fisc_year         = lv_year.              "Geschäftsjahr
  ls_header-fis_period        = lv_period.            "Geschäftsmonat
  ls_header-doc_type          = 'SB'.                 "Belegart
  ls_header-vatdate           = sy-datum.             "Steuermeldedatum


*== Buchungszeile Haben
  ls_acc_gl-itemno_acc        = 1.                    "Positionsnummer des Rechnungswesenbeleges
  ls_acc_gl-gl_account        = '0000184040'.         "Sachkonto der Hauptbuchhaltung
  ls_acc_gl-item_text         = 'Postext Haben'.      "Positionstext
  ls_acc_gl-acct_key          = space.                "Vorgangsschlüssel
  ls_acc_gl-acct_type         = 'S'.                  "Kontoart
  ls_acc_gl-costcenter        = ''.
  ls_acc_gl-value_date        = sy-datum.
  APPEND ls_acc_gl TO lt_acc_gl.

*== Buchungszeile Soll
  ls_acc_gl-itemno_acc        = 2.                    "Positionsnummer des Rechnungswesenbeleges
  ls_acc_gl-gl_account        = '0000420000'.         "Sachkonto der Hauptbuchhaltung
  ls_acc_gl-item_text         = 'Postext Soll'  .     "Positionstext
  ls_acc_gl-acct_key          = space.                "Vorgangsschlüssel
  ls_acc_gl-acct_type         = 'S'.                  "Kontoart
  ls_acc_gl-costcenter        = ''.
  ls_acc_gl-value_date        = sy-datum.
  ls_acc_gl-orderid           = 'XYZ'.                "Falls notwendig
  APPEND ls_acc_gl TO lt_acc_gl.

*== Haben Bruttobetrag
  ls_cur_am-itemno_acc        = 1.
  ls_cur_am-currency          = 'EUR'.
  ls_cur_am-currency_iso      = 'EUR'.
  ls_cur_am-amt_doccur        = '11.90-'.
  ls_cur_am-curr_type         = '00'.
  APPEND ls_cur_am TO lt_cur_am.

*== Soll Nettobetrag
  ls_cur_am-itemno_acc        = 2.
  ls_cur_am-currency          = 'EUR'.
  ls_cur_am-currency_iso      = 'EUR'.
  ls_cur_am-amt_doccur        = '10.00'.
  ls_cur_am-curr_type         = '00'.
  APPEND ls_cur_am TO lt_cur_am.

*== Soll Steuerbetrag
  ls_cur_am-itemno_acc        = 3.
  ls_cur_am-currency          = 'EUR'.
  ls_cur_am-currency_iso      = 'EUR'.
  ls_cur_am-amt_doccur        = '01.90'.
  ls_cur_am-amt_base          = '10.00'.
  ls_cur_am-curr_type         = '00'.
  APPEND ls_cur_am TO lt_cur_am.

*== Steuerinformation
  ls_acc_tx-itemno_acc        = 3.
  ls_acc_tx-tax_code          = 'AA'.
  ls_acc_tx-cond_key          = 'MWAS'.
  APPEND ls_acc_tx TO lt_acc_tx.

*== Beleg buchen
  CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
    EXPORTING
      documentheader = ls_header
    TABLES
      accountgl      = lt_acc_gl
      accounttax     = lt_acc_tx
      currencyamount = lt_cur_am
      return         = lt_return.

*== Protokoll
  LOOP AT lt_return INTO ls_return.
    WRITE: / ls_return-row,
             ls_return-message,
           / ls_return-type,
             ls_return-id,
             ls_return-number,
             ls_return-message_v1.
  ENDLOOP.

*== Commit work
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    IMPORTING
      return = ls_return.

Neuigkeiten

Januar 2015: SAP hat den Hinweis 2070697 zu den BAPIs BAPI_ACC_DOCUMENT_POST + BAPI_ACC_DOCUMENT_CHECK veröffentlicht:

Symptom

Es wird immer Steuer 0 errechnet oder nichtabzugsfähige Beträge werden nicht verteilt bei Verwendung der Methode gemäß Hinweis 1873588.

Ursache und Voraussetzungen

Mit Hinweis 1873588 wurde eine Methode zur Verfügung gestellt zur Ableitung der Steuerdaten für BAPIs. Die Methode soll das Füllen der Steuerdaten für die BAPIs bapi_acc_document_post und bapi_acc_document_check erleichtern, und zwar ursprünglich für die Ermittlung der Parameter für die zeilenweise Steuer mit Hinweis 1873588, weil hier grundlegende Änderungen im SAP Standard vorgenommen worden sind. Mit diesem Hinweis wird die Methode erweitert für die Berechnung von Steuern (VAT, Sales und Use Tax) inklusive Nichtabzugsfähigkeit und Anzahlungen. Es kann nun ein Gesamtsteuerbetrag für den Beleg vorgegeben werden, der dann entsprechend der berechneten Steuern verteilt wird. Ein neuer Parameter wurde eingeführt, mit dem der Methode mitgeteilt werden kann, dass der Belegsaldo die fehlende Steuer ist, die verteilt werden soll. Eine Berechnung wird nur für Belege durchgeführt, die keine Mischbelege sind, d.h. z.B. Belege mit Anzahlungen und steuerrelevanten Aufwandpositionen in einem Beleg werden nicht unterstützt. Steuern für Indien und Brasilien werden nicht durch diese Methode unterstützt. Direkte Steuern (DIRECT_TAX=’X’) werden ebenfalls nicht unterstützt.

Des weiteren sind alle Änderungen inklusive der Änderungen des Hinweises 1873588 auch für SAPKH60000-60404 verfügbar, d.h. die Änderungen sind mit diesem Hinweis runtergezogen worden, wobei die zeilenweise Übergabe der Steuern erst ab SAPKH60405 möglich ist, weil die BAPIS mit SAPKH60405 um den Parameter ITEMNO_TAX erweitert worden sind. Die Serviceklasse ist somit ab SAPKH60000 verfügbar und wird in allen Enhancementpacks ab SAPKH60000 gleich gehalten. Zudem wird der Funktionsbaustein FI_TAX_SERVICES_CALCULATE angeboten, der RFC-fähig ist. Dieser kann über RFC aufgerufen werden und ruft im SAP-System anschließend die obengenannte  Methode FI_TAX_SERVICES=>CALCULATE auf und gibt die Parameter zurück.

Lösung

Korrektur

Enno Wulff